﻿#define _CRT_SECURE_NO_WARNINGS 1
#include <iostream>
#include <vector>
#include <string>

using namespace std;

//void Fun(int& x) { cout << "左值引⽤" << endl; }
//void Fun(const int& x) { cout << "const 左值引⽤" << endl; }
//void Fun(int&& x) { cout << "右值引⽤" << endl; }
//void Fun(const int&& x) { cout << "const 右值引⽤" << endl; }
//template<class T>
//void Function(T&& t)
//{
//	//Fun(t);
//	Fun(forward<T>(t));
//}
//
//template<class ... Args>
//void Fun1(Args ... args)
//{
//	return args;
//}
//int main()
//{
//	int a = 2;
//	const int b = 2;
//	Function(a);
//	Function(b);
//	Function(3);
//	Function(move(a));
//
//
//	return 0;
//}
//template<class ... Args>
//void Print(Args&&... args)
//{
//	cout << sizeof...(args) << endl;
//}
//int main()
//{
//	double x = 2.2;
//	Print(); // 包⾥有0个参数
//	Print(1); // 包⾥有1个参数
//	Print(1, string("xxxxx")); // 包⾥有2个参数
//	Print(1.1, string("xxxxx"), x); // 包⾥有3个参数
//	Print(1, 2.1, 2, 2, "jdhgbchfs", 'a');
//	return 0;
//}

//template<class T,class ...Args>
//void showlist(T x, Args ...args)
//{
//	cout << x << " ";
//}
//
//template<class ... Args>
//void print(Args... args)
//{
//	showlist(args...);
//}
//
//int main()
//{
//	print("djgsa",7);
//	return 0;
//}

//template <class T>
//const T& GetArg(const T& x)
//{
//	cout << x << " ";
//	return x;
//}
//template <class ...Args>
//void Arguments(Args... args)
//{}
//template <class ...Args>
//void Print(Args... args)
//{
//	// 注意GetArg必须返回或者到的对象，这样才能组成参数包给Arguments
//	Arguments(GetArg(args)...);
//}
//// 本质可以理解为编译器编译时，包的扩展模式
//// 将上⾯的函数模板扩展实例化为下⾯的函数
//// 是不是很抽象，C++11以后，只能说委员会的⼤佬设计语法思维跳跃得太厉害
////void Print(int x, string y, double z)
////{
//// Arguments(GetArg(x), GetArg(y), GetArg(z));
////}
//int main()
//{
//	Print(1, string("xxxxx"), 2.2);
//	return 0;
//}

int main()
{
	auto add = [](int x, int y)->int {return x + y; };
	cout << add(1, 2) << endl;
	cout << add(3, 2) << endl;
	cout << add(4, 2) << endl;

	return 0;
}